package com.example.demo.common;

import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.util.UUID;

/**
 * @Author：徐志荣
 * @Date：2023/7/3 下午 3:15
 */
public class PasswordUtils {


    /*
    *1. 加盐并生成密码
    * @param password  明文密码
    * @return  保存在数据库中的密码
    */
    public  static String encrypt(String password){
        //a. 产生盐值 32位
        String salt = UUID.randomUUID().toString().replace("-","");

        //b. 生成加盐之后的密码
        String saltPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());

        //c. 生成最终密码 保存在数据库的密码 约定格式 : 32位盐值 $ 32位加盐之后的密码
        String finalPassword = salt + "$" + saltPassword;
        return finalPassword;
    }

    /*
    * 2. 生成加盐的密码 (方法1 的重载) 主要是给验证密码用的
    * @param password 明文
    * @param salt  固定的盐值
    * @return  最终密码
    */
    public  static String encrypt(String password,String salt){

        //1. 先生成一个加盐之后的密码
        String saltPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());

        //2. 生成最终密码
        String finalPassword = salt + "$" + saltPassword;
        return finalPassword;
    }


    /*
     * 3. 验证密码
     * @param inputPassword 用户输入的明文密码
     * @param finalPassword 数据库保存的最终密码
     * @return
     */
    public static boolean check(String inputPassword, String finalPassword){
        //输入的密码和最终密码 不为空
        //最终密码是 65 位
        if(StringUtils.hasLength(inputPassword) && StringUtils.hasLength(finalPassword) && finalPassword.length() == 65 ){
            //1. 得到盐值
            //因为 $ 是个关键字, 应该转义一下
            String salt = finalPassword.split("\\$")[0];
            //2. 使用之前加密的步骤,将明文密码和已经得到的盐值进行加密,生成最终密码
            String confirmPassword = PasswordUtils.encrypt(inputPassword,salt).split("$")[0];
            //3. 对比两个密码是否相同
            return confirmPassword.equals(finalPassword);
        }
        return false;

    }

    public static void main(String[] args) {
        String password = "123456";
        String finalPassword = PasswordUtils.encrypt(password);

        System.out.println(finalPassword);

        //对比
  /*      String inputString  = "123456";
        System.out.println(PasswordUtils.check(inputString,finalPassword));
        String inputString2 = "rong123456";
        System.out.println(PasswordUtils.check(inputString2,finalPassword));*/




    }

}
